﻿#define  _CRT_SECURE_NO_WARNINGS 1
// int是整数类型

// float是小数（浮点型）
// 数据类型分为内置类型（c语言本身就具有的）和自定义类型（我们自己创造的）
// 内置类型分为字符型，整型，浮点型，布尔类型
// 自定义类型分为数组，结构体-stuct，枚举-enum，联合体-union

// 字符类型char类型 character
// 整型-int  short-短整型  long-长整型 long long-更长的整型
//           short[int]    long[int]     long long[int][]中的可以省略不写
// 浮点型-float  3.5=0.35*10  所以小数称为浮点数
// float-单精度浮点型  double-双精度浮点型 long double-精度更高的浮点型
//布尔类型-_Bool  早期在c语言中用整数0表示假 非零值表示真 c99引入了布尔类型
// 布尔类型的使用需要包含头文件<stdbool.h>
// 布尔类型的取值是：true 或 false
//布尔值就是表示真/假的变量  
#include <stdbool.h>  //头文件<stdbool.h> bool需要
#include <stdio.h>   //头文件<stdio.h>，printf需要
//int main()
//{
//	bool flag = true;//此变量名为flag  
//	//此编译器可能使用不了大写的_Bool 所以直接用bool
//	if (flag)
//		printf("hehe\n");
//	return 0;
//} 
//sizeof 操作符 专门用于计算sizeof的操作符数的类型长度的，单位字节
//sizeof 操作符的操作数可以是类型也可以是变量或者表达式

//int main()
//{
//	printf("%zd\n", sizeof(char)); //字节：计算机中的单位 bit比特位
//	printf("%zd\n", sizeof(short));//往上就是Byte字节 一个2进制位的存储需要
//	printf("%zd\n", sizeof(int));//一个bit位的空间
//	printf("%zd\n", sizeof(float));//1Byte=8bit 1KB=1024Byte
//	printf("%zd\n", sizeof(double));//1MB=1024KB  往上GB TB PB 1024=2的10次方
//	return 0;//c语言标准sizeof(long)>=sizeof(int)
//	// char-1字节  short-2字节  int-4字节  long-4字节（不同编译器不同）
//	// long long-8字节  float-4字节  double-8字节 
//	// long double -8字节
//}
#include <stdio.h>
//int main()
//
//{
//
//	int a = 10;
//		printf("%zd\n", sizeof(int));
//	printf("%zd\n", sizeof(a));//类型就不可以省略
//	printf("%zd\n", sizeof a);  //sizeof 若为表达式或变量括号可以省略
//		return 0;
//}
//int main()
//{
//	printf("%zd\n", sizeof(bool));//布尔类型的长度为1
//	return 0;
//}
#include <stdio.h>
//int main()
//{
//	short s = 2;
//	int b = 10;
//	printf("%d\n", sizeof(s = b + 1));
//	printf("s = %d\n", s);//s结果为2 不是11 sizzeof如果放的是表达式
//	//表达式不会真实进行计算！ 1是int  b也是int  两个相加也是int类型
//	//s是short类型  最后的结果s说的算  所以计算长度是short类型的长度
//	//也就是2
//	//sizeof针对的是类型和表达式  strlen是字符串 二者不要混淆
//
//			return 0;
//}
//signed和unsigned关键字修饰字符型和整型类型的
//signed 表示一个类型带有正负号 ，包含负值
//unsiged表示此类型不带正负号，只能表示0和正整数
//对于int类型是默认带有正负号的，也就是说int等同与signed int
//int main()
//{
////signed int--有符合的int，num只是一个变量名
//	signed int num = 100;
//	num = -200;
//
//	unsigned num2 = 100;
//	num2 = 1000;
//
//	return 0;
//}

//signed char
//char--char到底有无符号呢？这个不确定，取决于编译的实现
// 大部分的编译器上的char==signed char 
//unsigned char
// int 等价signed int
//signed int
//unsigned int
//对于有符号的整数打印应该使用%d
//对于无符号的整数打印应该使用%u
//int main()
//{
//	int num = -100; //变量名为num
//	printf("%d\n", num);
//	return 0;
//}

//unsigned int中的int可以省略
//创建变量的语法规则
// data_type name；
//  数据类型  变量名
#include <stdbool.h> //用布尔类型需要的头文件

//int num = 100 这就是全局变量

//int main()
// 
// 
//{
//     这些变量在这个范围中创建的称为局部变量，大括号内部的变量
//    unsigned int age = 10 //age变量 
//    printf("%u\n", age);  //需要初始化之后才能打印这个变量，否则报错
//    char ch = 'q'; //ch变量
//    float score = 3.14f; //score变量 直接输入3.14是double类型 加了f就是float类型
//    double weight = 4.5;//weight变量
//    bool flag = true;//flag变量
//    return 0;
//} 
//变量在创建的时候给一个初始值这叫做初始化

//int main()
//{
//	{
//		int num = 10;
//		printf("%d\n", num);
//	}
//	printf("%d\n", num);//此时num就无值，不能用上面的10
//
//	return 0;
//}

//若局部变量和全局变量相同了怎么办
//int m = 1000;
//
//int main()
//{
//	int m = 1;
//	printf("%d\n", m);
//
//	return 0;
//} //此时打印的结果是局部变量，而不是全局变量，局部优先
//操作符就是运算符  %取模（余数）
//int main()
//{
//	printf("%d\n", 33 + 54);//33叫左操作数 54叫又操作数，+号也叫双目操作符
//	//双目操作符，有两个操作数的操作符
//	int a = 10;
//	int b = 20;
//	printf("%d\n", a + b);
//	printf("%d\n", a + 10);
//	return 0;
//}

//int main()
//{
//	printf("%d\n", 9 / 3);//3
//	printf("%d\n", 10 / 4);//2.5 对于除法来说 若两边都是整数，则执行整数除法
//	//所以得到的结果是2 10/4=2.5
////如果需要得到小数，则两个数中必须有一个是浮点数，这样才会执行浮点数的除法
//	//相应的也需要%f去打印
//	printf("%f\n", 10 / 4.0);
//	return 0;
//}

//int main()
//{
//	int score = 5;
//	score = (score / 20) * 100;//先得0 然后0*1000 = 0
//	printf("%d\n", score);//若想得25则需要变成浮点数的除法
//	int m = 5;
//	m = (m / 20.0) * 100;
//	printf("%d\n", m);//结果就是25
//	return 0;
//}

//%求模，会返回两个整数相除的余数，这个运算符只能用于整数，不能用于浮点数
//int main()
//{
//	printf("%d\n", 10 % 3); //10/3=3....1 此结果就为1
//	return 0;
//}

//负数求模的结果由第一个运算数的正负号决定的
//int main()
//{
//	printf("%d\n", 11 % -5); // 1
//	printf("%d\n", -11 % -5); // -1
//	printf("%d\n", -11 % 5); // -1
//
//	return 0;
//}

//int main()
//{
//	int a = 0; //初始化
//	a = 10; //赋值，=就是赋值操作符
//	return 0;
//}

//int main() //赋值操作符可以连续赋值，但是建议拆开写，一句代码写成两句
//{
//	int a = 3;
//	int b = 5;
//	int c = 0;
//	c = b = a + 3; //可以连续赋值，从右向左依次赋值
//	return 0;
//}

// *= */ *%这些也可以的
//int main()
//{
//	int a = 0;//初始化
//	a = a + 10;
//	a += 10; //复合赋值
//	//这两句代码是等价的
//	a = a - 3;
//	a -= 3;//复合赋值
//	//这两句代码也是等价的，
//}

//单目操作符：++ -- + -
//int main()
//{
//	int a = 5;
//	//a = a + 1;//a自增1
//	//a++;//也是a自增1 后置++
//	int b = ++a;//也是a自增1 前置++ 口诀：先++，后使用,a=a+1,b=a
//	printf("a= %d\n", a);//6
//	printf("b= %d\n", a);//6
//	return 0;
//}
//int main()
//{
//	int a = 5;
//	int b = a++;//后置++，先使用，后++,b=a,a=a+1
//	printf("a = %d\n", a);//6
//	printf("b = %d\n", b);//5
//	return 0;
//}  //这两个的区别就在赋值给b，--同理

//int main()
//{
//	int a = 5;
//	//printf("%d\n", --a);//4
//	printf("%d\n", a--);//5
//	printf("%d\n", a);//4
//	return 0;
//}

//int main()
//{
//	int a = -10;
//	printf("%d\n", +a);//-10
//	printf("%d\n", +10);//10
//	printf("%d\n", 10);//10  +号不影响
//	return 0;
//}

//int main()
//{
//	int a = -10;
//	printf("%d\n", -a);// 负号有影响 10
//	return 0;
//}

// 强制性转换 1（类型）

//int main()
//{
//	//int a = 3.14;//两边类型不一样，转化可能会丢失数据 左边是int4字节 右边是double8字节
//	int a = (int)3.14;//这就是强制性转换，转为整数 不要这样int（3.14）这是错误的
//	printf("%d\n", a);//3
//
//	return 0;
//}

//printf和scanf

//printf=print format  打印  格式化
#include <stdio.h> //使用printf需要开头写上头文件<stdio.h>
//int main()
//{
//	
//	printf("hello would\n");//\n可以让光标到下一行
//	return 0;
//}
//int main()
//{
//	printf("abc\nefd");//打印的是两行
//	return 0;
//}

//int main()
//{
//	printf("%d\n", 100);  //%d就是占位符，帮100站位  100
//	printf("%dabc", 100); // 100abc
//	return 0;
//}  %d 表示代入的值是一个整数  %s 表示带入的值是字符串

//int main()
//{
//	printf("%s will come tonight\n", "李四");
//	printf("%s will come tonight\n", "十五"); \n换行
//	return 0;
//} 输出文本中可以有多个占位符

//int main()
//{
//	printf("%s says it is %d o'clock", "十五",10); //按顺序来，一一对应的
//                1个参数                2个   3个
//	return 0;
//}
//printf() 参数与占位符是⼀⼀对应关系，如果有 n 个占位符， printf() 的参数就应该有 n + 1
// 个。如果参数个数少于对应的占位符， printf() 可能会输出内存中的任意值。

// %a -字符   %f-小数（包括float和double）  %d -十进制的整数 int %i基本等同%d
// float- %f  double- %lf    short int- %hd   
//%hu-unsigned short int   %ld-long int类型
//%Lf - long double  %p-指针  %s-字符串  %u-无符号整数   %x-16进制
//%zd-size_t
// %%可以输出一个百分号

//int main()
//{
//	printf("this is %c\n", 'A');
//	return 0;
//}
 
//int main()
//{
//	printf("%d\n", 123);
//	printf("%5d\n", 123); //printf（）允许限定占位符的最小宽度 此时表示输出这个数字
//	//最少输出5位   分别是123
//	        //              123用空格来补齐5位
//	printf("%5d\n", 123456);//就正常输出六位，因为上面要求是最小五位 123456
//	printf("%-5dxxx\n", 123);//输出123  xxx空两个格
//	return 0;
//}

//int main()
//{
//	printf("%lf\n", 123.45);//%f 在打印的时候小数点后默认6位
//	printf("%12lf\n",123.45);//最小打印12位，而且算小数点 因此打印出来前面有两个空格
//	return 0;
//
//}

//int main()
//{
//	printf("%d\n", 123);//我想打印出+123需要%+d就可以总是表示出正负号
//	printf("%d\n", -123);// -123
//	printf("%+d", 123);// +123
//
//	return 0;
//}

//int main()
//{
//	printf("%lf\n", 123.456);//小数点后面默认6位
//	printf("%.2lf\n", 123.456);//就可以限定为2位 而且会四舍五入
//	printf("%12.1lf\n", 123.45);//表示总长度最少为12位，小数点后面只有1位 （7个空格）123.5
//	printf("%3.1lf\n", 123.45);//打印出来是123.5 4位
//	printf("%*.*lf\n",12,1, 123.45);//这样也可以  7个空格123.5
//
//	return 0;
//}

//int main()
//{
//	printf("%s\n", "abcdef"); //abcdef
//	printf("%.3s\n", "abcdef"); //打印出来就是abc %.[m]s指定输出长度 【m】是数字也就是长度
//
//	return 0;
//}

// scanf c语言中的输入函数
int main()

{
	int score = 0;
	printf("请输入成绩:");
	scanf("%d",&score);//输入操作
	//sacanf函数中占位符的后边的参数需要的是地址
	//&取地址操作符，&score-取出score的地址
	printf("成绩是 %d\n", score);
	return 0;
}

